package com.ljy.my_study.leetcode.路径总和III;

import com.ljy.my_study.util.TreeNodeUtil;
import com.ljy.my_study.util.TreeNodeUtil.*;

/**
 * @author lijunying
 * @date 2021/9/28 13:57
 */
public class TestMain {

//    给定一个二叉树的根节点 root ，和一个整数 targetSum ，求该二叉树里节点值之和等于 targetSum 的 路径 的数目。
//
//    路径 不需要从根节点开始，也不需要在叶子节点结束，但是路径方向必须是向下的（只能从父节点到子节点）。
//
//             
//
//    示例 1：
//
//
//
//    输入：root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8
//    输出：3
//    解释：和等于 8 的路径有 3 条，如图所示。
//    示例 2：
//
//    输入：root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
//    输出：3
//             
//
//    提示:
//
//    二叉树的节点个数的范围是 [0,1000]
//            -109 <= Node.val <= 109 
//            -1000 <= targetSum <= 1000 
//
//    来源：力扣（LeetCode）
//    链接：https://leetcode-cn.com/problems/path-sum-iii
//    著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。

    public static void main(String[] args) {
        TreeNode root=TreeNodeUtil.deserialize("10,5,-3,3,2,null,11,3,-2,null,1");
        System.out.println(root.left);
        System.out.println(root.right);
        System.out.println(new TestMain().pathSum(root,8));
    }

//    深度优先算法
    public int pathSum(TreeNode root, int targetSum) {
        int count=0;
        if(root==null){
            return 0;
        }
        if(root.val==targetSum){
            count++;
        }
        count=dfs(root,root.val,targetSum,count);
        count+=pathSum(root.left,targetSum);
        count+=pathSum(root.right,targetSum);
        return count;
    }

    private int dfs(TreeNode node,int sum,int target,int count){
        if(node==null){
            return count;
        }
        if(node.left!=null){
            int newSum=sum+node.left.val;
            if(newSum==target){
                count++;
            }
            count=dfs(node.left,newSum,target,count);
        }
        if(node.right!=null){
            int newSum=sum+node.right.val;
            if(newSum==target){
                count++;
            }
            count=dfs(node.right,newSum,target,count);
        }
        return count;
    }
}
